/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.general.beans;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import org.cip.esymons.colegiatura.bc.ColegiadoFacadeLocal;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.general.bc.HistorialConexionDelegate;
import org.cip.esymons.general.bc.TipoUsuarioDelegate;
import org.cip.esymons.general.bc.UserExtMenuDelegate;
import org.cip.esymons.general.bc.UsuarioExternoDelegate;
import org.cip.esymons.general.be.HistorialConexion;
import org.cip.esymons.general.be.TipoUsuario;
import org.cip.esymons.general.be.UserExtMenu;
import org.cip.esymons.general.be.UsuarioExterno;
import org.cip.esymons.general.util.ControladorAbstracto;

/**
 *
 * @author ADMINISTRADOR
 */
public class UsuarioExternoController {

    private UsuarioExternoDelegate delegadoUserExterno;
    private HistorialConexionDelegate delegadoConexion;
    private TipoUsuarioDelegate delegadoTipoUsuario;
    private UserExtMenuDelegate delegadoMenuWeb;
    private Colegiado colegiado;
    private UsuarioExterno userExterno;
    private HistorialConexion historialConexion;
    private TipoUsuario usuarioTipo,UserType;
    private UserExtMenu menuWeb;
    
    @EJB
    ColegiadoFacadeLocal delegadoColegiado;
    private Integer opcion;
    private Boolean bandera;
    private String numeroCIP;
    private Integer logueado;
    private String mensaje;
    private String nombreUsuario;
    private String tipoUsuario;
    private String ipUsuario,hostUsuario;
    private String cuenta;
    private String clave;
    private String claveNueva,claveNueva2;
    private Integer tipo;
    private String tipoUser;
    private String cantidad;

    List<UserExtMenu> listaMenuWeb;
    List<UsuarioExterno> listaUsuariosExt;

    public UsuarioExternoController() {

        delegadoUserExterno = new UsuarioExternoDelegate();
        delegadoConexion = new HistorialConexionDelegate();
        delegadoMenuWeb = new UserExtMenuDelegate();
        delegadoTipoUsuario = new TipoUsuarioDelegate();
        userExterno = new UsuarioExterno();
        colegiado = new Colegiado();
        historialConexion = new HistorialConexion();        
        listaMenuWeb = new ArrayList<UserExtMenu>();
        listaUsuariosExt = new ArrayList<UsuarioExterno>();
        bandera = false;
        usuarioTipo = new TipoUsuario();
        UserType = new TipoUsuario();
        menuWeb = new UserExtMenu();
    }

    public UserExtMenu getMenuWeb() {
        return menuWeb;
    }

    public void setMenuWeb(UserExtMenu menuWeb) {
        this.menuWeb = menuWeb;
    }

    public String getClaveNueva2() {
        return claveNueva2;
    }

    public void setClaveNueva2(String claveNueva2) {
        this.claveNueva2 = claveNueva2;
    }

    public TipoUsuario getUserType() {
        return UserType;
    }

    public void setUserType(TipoUsuario UserType) {
        this.UserType = UserType;
    }

    public Integer getOpcion() {
        return opcion;
    }

    public void setOpcion(Integer opcion) {
        this.opcion = opcion;
    }

    public String getCantidad() {
        return cantidad;
    }

    public void setCantidad(String cantidad) {
        this.cantidad = cantidad;
    }

    public List<UsuarioExterno> getListaUsuariosExt() {
        return listaUsuariosExt;
    }

    public void setListaUsuariosExt(List<UsuarioExterno> listaUsuariosExt) {
        this.listaUsuariosExt = listaUsuariosExt;
    }

    public TipoUsuario getUsuarioTipo() {
        return usuarioTipo;
    }

    public void setUsuarioTipo(TipoUsuario usuarioTipo) {
        this.usuarioTipo = usuarioTipo;
    }

    public TipoUsuarioDelegate getDelegadoTipoUsuario() {
        return delegadoTipoUsuario;
    }

    public void setDelegadoTipoUsuario(TipoUsuarioDelegate delegadoTipoUsuario) {
        this.delegadoTipoUsuario = delegadoTipoUsuario;
    }

    public String getTipoUser() {
        return tipoUser;
    }

    public void setTipoUser(String tipoUser) {
        this.tipoUser = tipoUser;
    }

    public Integer getTipo() {
        return tipo;
    }

    public void setTipo(Integer tipo) {
        this.tipo = tipo;
    }

    public String getClaveNueva() {
        return claveNueva;
    }

    public void setClaveNueva(String claveNueva) {
        this.claveNueva = claveNueva;
    }

    public String getClave() {
        return clave;
    }

    public void setClave(String clave) {
        this.clave = clave;
    }

    public String getCuenta() {
        return cuenta;
    }

    public void setCuenta(String cuenta) {
        this.cuenta = cuenta;
    }

    public UserExtMenuDelegate getDelegadoMenuWeb() {
        return delegadoMenuWeb;
    }

    public void setDelegadoMenuWeb(UserExtMenuDelegate delegadoMenuWeb) {
        this.delegadoMenuWeb = delegadoMenuWeb;
    }

    public List<UserExtMenu> getListaMenuWeb() {
        return listaMenuWeb;
    }

    public void setListaMenuWeb(List<UserExtMenu> listaMenuWeb) {
        this.listaMenuWeb = listaMenuWeb;
    }

    public String getTipoUsuario() {
        return tipoUsuario;
    }

    public void setTipoUsuario(String tipoUsuario) {
        this.tipoUsuario = tipoUsuario;
    }

    public String getHostUsuario() {
        return hostUsuario;
    }

    public void setHostUsuario(String hostUsuario) {
        this.hostUsuario = hostUsuario;
    }

    public String getIpUsuario() {
        return ipUsuario;
    }

    public void setIpUsuario(String ipUsuario) {
        this.ipUsuario = ipUsuario;
    }

    public HistorialConexionDelegate getDelegadoConexion() {
        return delegadoConexion;
    }

    public void setDelegadoConexion(HistorialConexionDelegate delegadoConexion) {
        this.delegadoConexion = delegadoConexion;
    }

    public HistorialConexion getHistorialConexion() {
        return historialConexion;
    }

    public void setHistorialConexion(HistorialConexion historialConexion) {
        this.historialConexion = historialConexion;
    }

    public String getNombreUsuario() {
        return nombreUsuario;
    }

    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    public Integer getLogueado() {
        return logueado;
    }

    public void setLogueado(Integer logueado) {
        this.logueado = logueado;
    }

    public String getNumeroCIP() {
        return numeroCIP;
    }

    public void setNumeroCIP(String numeroCIP) {
        this.numeroCIP = numeroCIP;
    }

    public String getnumeroCIP() {
        return numeroCIP;
    }

    public void setnumeroCIP(String numeroCIP) {
        this.numeroCIP = numeroCIP;
    }

    public Boolean getBandera() {
        return bandera;
    }

    public void setBandera(Boolean bandera) {
        this.bandera = bandera;
    }

    public ColegiadoFacadeLocal getDelegadoColegiado() {
        return delegadoColegiado;
    }

    public void setDelegadoColegiado(ColegiadoFacadeLocal delegadoColegiado) {
        this.delegadoColegiado = delegadoColegiado;
    }

    public Colegiado getColegiado() {
        return colegiado;
    }

    public void setColegiado(Colegiado colegiado) {
        this.colegiado = colegiado;
    }
    
    public UsuarioExternoDelegate getDelegadoUserExterno() {
        return delegadoUserExterno;
    }

    public void setDelegadoUserExterno(UsuarioExternoDelegate delegadoUserExterno) {
        this.delegadoUserExterno = delegadoUserExterno;
    }

    public UsuarioExterno getUserExterno() {
        return userExterno;
    }

    public void setUserExterno(UsuarioExterno userExterno) {
        this.userExterno = userExterno;
    }

    public String nuevo(){

        return "nuevoUsuario";
    }

    public String editar(){

        return "editarUsuario";
    }

    public String retornar(){

        return "retornar";
    }

    public String relacionUsuarios(){

        if(opcion == null){
            opcion = 1;
        }
        switch(opcion){

            case 1 : listaUsuariosExternos(); break;
            case 2 : listaUsuariosPorTipo(); break;

        }
        return null;
    }

    public List<UsuarioExterno> listaUsuariosPorTipo(){

        listaUsuariosExt = new ArrayList<UsuarioExterno>();
        listaUsuariosExt = delegadoUserExterno.listaUsuariosPorTipo(UserType);
        return listaUsuariosExt;
    }

    public List<UsuarioExterno> listaUsuariosExternos(){

        try{
        listaUsuariosExt = new ArrayList<UsuarioExterno>();
//        listaUsuariosExt = delegadoUserExterno.findAll();
        listaUsuariosExt = delegadoUserExterno.listaUsuarios();

//         for(UsuarioExterno user : listaUsuariosExt){
//               if(user.getTusCodigo().getTusNombre().compareToIgnoreCase("colegiado")==0){
//                  colegiado = new Colegiado();
//                  colegiado = delegadoColegiado.buscarColegiadoXDni(user.getGueClave());
//                  user.setColegiado(colegiado);
//               }
//           }
        cantidad = "Nro de Usuarios : "+listaUsuariosExt.size();
        return listaUsuariosExt;
        }catch(Exception ex){
            return null;
        }
    }

    public String registraUsuario(){

        userExterno.setGueUsuario(colegiado.getColnumeroCip());
        userExterno.setGueClave(colegiado.getPersonaNatural().getPerNroDNI());
        userExterno.setGueFecha(new Date());
        userExterno.setGueActivo(true);
        userExterno.setGuePregunta("Sin Pregunta");
        userExterno.setGueRespuesta("Sin Respuesta");
        delegadoUserExterno.create(userExterno);
        userExterno = new UsuarioExterno();
        
        return  null;
    }

    public String registraUser(){

        userExterno.setGueFecha(new Date());
        userExterno.setGueActivo(true);
        userExterno.setGuePregunta("Sin Pregunta");
        userExterno.setGueRespuesta("Sin Respuesta");
        delegadoUserExterno.create(userExterno);
        userExterno = new UsuarioExterno();

        return  null;
    }

    public String editarUsuario(){
        
//        String destino;
        if(claveNueva != null && !claveNueva.isEmpty()){
//        if(claveNueva.compareTo(claveNueva2)==0){
            userExterno.setGueClave(claveNueva);
            delegadoUserExterno.edit(userExterno);
            userExterno = new UsuarioExterno();

            return "retornar";
        }else{
          mensaje = "Error: no coinciden las claves!";
          mostrarMensaje("ADVERTENCIA: ", mensaje, FacesMessage.SEVERITY_WARN);
          return  null;
        }       
       
    }

    public String quitarUsuario(){

        delegadoUserExterno.remove(userExterno);
        userExterno = new UsuarioExterno();
        return  null;
    }


    public String buscaCIP(){

        try {
            colegiado = new Colegiado();

            if(numeroCIP.length()<3){
                     numeroCIP = "0000"+ numeroCIP;
                 }else{
                       if(numeroCIP.length()<4){
                           numeroCIP = "000"+numeroCIP;
                       }else{
                           if(numeroCIP.length()<5){
                               numeroCIP = "00"+numeroCIP;
                           }else{
                               if(numeroCIP.length()<6){
                                  numeroCIP = "0"+numeroCIP;
                               }
                           }
                       }
                 }
            bandera = true;
            colegiado = delegadoColegiado.buscaColegiadoPorCIP(numeroCIP);
            numeroCIP = null;
            return null;
        } catch (Exception e) {
            return null;
        }
    }

    public String ingresarIntranet() {

        try {
            cuenta = userExterno.getGueUsuario();
            clave = userExterno.getGueClave();            

            if(clave == null || clave.length()<0){
                mensaje = "Error: usuario no existe o ingreso incorrectamente la cuenta y clave, intentelo otra vez!";
                mostrarMensaje("ADVERTENCIA: ", mensaje, FacesMessage.SEVERITY_WARN);
            }
            String claveVisitante = "visitante";

            userExterno = new UsuarioExterno();
            System.out.println("cuenta : "+cuenta);
            System.out.println("clave : "+clave);

            if(cuenta.compareToIgnoreCase("visitante")==0){

                if(clave.length()==8){
                   userExterno = delegadoUserExterno.validarUsuario(cuenta, claveVisitante);
                   tipo = userExterno.getTusCodigo().getTusCodigo();
                }else{
                   userExterno = new UsuarioExterno();                   
                }

            }else{
                if(cuenta.compareToIgnoreCase("colegiaturacn")!=0){

                   if(cuenta.length()<3){
                         cuenta = "0000"+ cuenta;
                     }else{
                           if(cuenta.length()<4){
                               cuenta = "000"+cuenta;
                           }else{
                               if(cuenta.length()<5){
                                   cuenta = "00"+cuenta;
                               }else{
                                   if(cuenta.length()<6){
                                      cuenta = "0"+cuenta;
                                   }
                               }
                           }
                     }
                }
                System.out.println("colegiado");
                System.out.println("cuenta : "+cuenta);
                System.out.println("clave : "+clave);

                userExterno = delegadoUserExterno.validarUsuario(cuenta, clave);
                tipo = userExterno.getTusCodigo().getTusCodigo();
            }

            if (userExterno == null) {
                logueado = 1;
                mensaje = "Error: usuario no existe o ingreso incorrectamente la cuenta, clave o DNI, intentelo otra vez!";
                mostrarMensaje("ADVERTENCIA: ", mensaje, FacesMessage.SEVERITY_WARN);
                userExterno = new UsuarioExterno();
                return null;
            } else {
                logueado = 2;
                //
                Cookie cookie = new Cookie("Usuario", userExterno.getGueCodigo().toString());
                cookie.setPath("/");
                ControladorAbstracto.getResponse().addCookie(cookie);

                 HttpServletRequest request =  ControladorAbstracto.getRequest();
                 ipUsuario = request.getRemoteAddr();
                 hostUsuario = request.getRemoteHost();                 

                 listaMenuWeb = new ArrayList<UserExtMenu>();
                 listaMenuWeb = delegadoMenuWeb.menuPorUsuario(userExterno.getTusCodigo());

                 if(userExterno.getTusCodigo().getTusNombre().compareToIgnoreCase("Colegiado")==0){
                     
                     colegiado = delegadoColegiado.buscarColegiadoXDni(clave);

                     tipoUsuario = userExterno.getTusCodigo().getTusNombre();
                     nombreUsuario = colegiado.getPersonaNatural().getNombreColegiado();

                     historialConexion.setHcoClave("");
                 }else{
                     tipoUsuario = userExterno.getTusCodigo().getTusNombre();
                     nombreUsuario = "Visitante";
                     historialConexion.setHcoClave(clave);
                 }
                
                 historialConexion.setGueCodigo(userExterno);
                 historialConexion.setHcofechaConexion(new Date());
                 historialConexion.setHcoIp(ipUsuario);
                 historialConexion.setHcoHost(hostUsuario);
                 Date date = new Date(System.currentTimeMillis());
                 String hora = (date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
                 historialConexion.setHcoHoraInicio(hora);
                 delegadoConexion.create(historialConexion);
//                 historialConexion = new HistorialConexion();                 

                return "ir_a_intranet";
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Este usuario no puede ingresar al sistema.", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
            return null;
        }
    }

//    public String cargarURL(){
//
//         HttpServletRequest request = ControladorAbstracto.getRequest();
//         String menuAccesado = request.getRequestURI();
//         String servlet = request.getServletPath();
//         System.out.println("menu accesado : "+menuAccesado);
//         System.out.println("servlet accesado : "+servlet);
//         System.out.println("menuWEB : "+menuWeb.getUemrutaPagina());
//
//        return null;
//    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    public String closeControllers() {

        Date date = new Date(System.currentTimeMillis());
        String horaFin = (date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
        historialConexion.setHcoHoraFin(horaFin);
        delegadoConexion.edit(historialConexion);
        historialConexion = new HistorialConexion();
        
         //eliminando las cookies de tpdps
        Cookie cookie = new Cookie("Usuario","nulo");
        cookie.setPath("/");
        cookie.setMaxAge(0);
        ControladorAbstracto.getResponse().addCookie(cookie);
        //modulo general
        ControladorAbstracto.removeSessionProperty("TipoUsuarioController");
        ControladorAbstracto.removeSessionProperty("UsuarioExternoController");
        ControladorAbstracto.removeSessionProperty("HistorialConexionController");
        ControladorAbstracto.removeSessionProperty("JasperController");
        ControladorAbstracto.removeSessionProperty("MenuWebController");
        return "ir_a_intranet";
    }

}
